﻿----------------------------------------------------------------------------------------------------------
-----------------------------------pca_parqueos.usuarios_terminales---------------------------------------
----------------------------------------------------------------------------------------------------------
CREATE OR REPLACE FUNCTION pca_parqueos.fn_get_usuario_terminal(varchar,--empresa_id $1
								varchar,--oficina_id $2
								varchar --usuario_id $3
								)RETURNS SETOF pca_parqueos.vw_usuarios_terminales AS
$$
DECLARE
	_row pca_parqueos.vw_usuarios_terminales%ROWTYPE;
BEGIN
	FOR _row IN
		SELECT
			*
		FROM
			pca_parqueos.vw_usuarios_terminales
		WHERE
			empresa_id = $1 AND
			oficina_id = $2 AND
			usuario_id = $3
	LOOP
		RETURN NEXT _row;
	END LOOP;
END;
$$
LANGUAGE plpgsql;

----------------------------------------------------------------------------------------------------------
------------------------------------- pca_parqueos.liquidaciones------------------------------------------
----------------------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION pca_parqueos.fn_add_liquidacion(varchar,--empresa_id $1
							   varchar,--oficina_id $2
							   varchar,--usuario_id $3
							   bigint,--sesion_id $4
							   varchar,--moneda_id $5
							   numeric --monto $6
							   )RETURNS bigint AS
$$
DECLARE
	_terminal_id pca_parqueos.usuarios_terminales.terminal_id%TYPE;
	_row_liquidacion pca_parqueos.vw_liquidaciones%ROWTYPE;
	_id pca_caja.liquidaciones.liquidacion_id%TYPE;
	_grupo_movimiento_id pca_caja.movimientos.grupo_movimiento_id%TYPE;
BEGIN
	SELECT
		terminal_id
	INTO
		_terminal_id
	FROM
		pca_parqueos.usuarios_terminales
	WHERE
		empresa_id = $1 AND
		oficina_id = $2 AND
		usuario_id = $3;

	IF FOUND THEN
		--Solo permitirmos una liquidacion activa por terminal
		SELECT
			*
		INTO
			_row_liquidacion
		FROM
			pca_parqueos.vw_liquidaciones
		WHERE
			empresa_id = $1 AND
			oficina_id = $2 AND
			usuario_id = $3 AND
			terminal_id = _terminal_id AND
			cerrado = false;

		IF NOT FOUND THEN
			_id := pca_caja.fn_add_liquidacion($1,$2,$3);
			INSERT INTO pca_parqueos.liquidaciones VALUES($1,$2,_id,$3,_terminal_id);

			_grupo_movimiento_id := 1500453386;

			--REGISTRAMOS EL SALDO INICIAL
			PERFORM pca_caja.fn_add_movimiento($1,--empresa_id
						           $2,--oficina_id
						           _grupo_movimiento_id,--grupo_movimiento_id
						           NULL,--subgrupo_movimiento_id
						           $4,--sesion_id
						           current_date,--fecha
						           _id,--liquidacion_id
						           $3,--usuario_id
						           'SALDO INICIAL CAJA',--detalle
						           $5,--moneda_id
						           $6 --monto
						           );
			
			RETURN _id;
		ELSE
			RAISE EXCEPTION 'Existen una liquidacion pendiente con fecha-hora inicio % % , solo se permite una liquidacion por cada terminal existente',_row_liquidacion.fecha_hora_inicio::date,to_char(_row_liquidacion.fecha_hora_inicio,'HH12:MI PM');
		END IF;
	ELSE
		RAISE EXCEPTION 'No existe un terminal asignado al usuario';
	END IF;
END;
$$
LANGUAGE plpgsql;

----------------------------------------------------------------------------------------------------------
------------------------------------ pca_parqueos.tipos_vehiculos-----------------------------------------
----------------------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION pca_parqueos.fn_get_list_tipos_vehiculos()RETURNS SETOF pca_parqueos.tipos_vehiculos AS
$$
DECLARE
	_row pca_parqueos.tipos_vehiculos%ROWTYPE;
BEGIN
	FOR _row IN
		SELECT
			*
		FROM
			pca_parqueos.tipos_vehiculos
		ORDER BY
			tipo_vehiculo_id ASC
	LOOP
		RETURN NEXT _row;
	END LOOP;
END;
$$
LANGUAGE plpgsql;

----------------------------------------------------------------------------------------------------------
------------------------------------pca_parqueos.vehiculos------------------------------------------------
----------------------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION pca_parqueos.fn_add_vehiculo(integer,--tipo_vehiculo_id $1
							varchar --placa $2
							)RETURNS bigint AS
$$
BEGIN
	INSERT INTO pca_parqueos.vehiculos
		(tipo_vehiculo_id,
		placa)
	VALUES
		($1,$2);

	RETURN pca_global.fn_pseudo_encrypt_bigint(currval('pca_parqueos.seq_vehiculo_id')::integer);
END;
$$
LANGUAGE plpgsql;

----------------------------------------------------------------------------------------------------------
------------------------------------pca_parqueos.registros------------------------------------------------
----------------------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION pca_parqueos.fn_add_registro(varchar,--empresa_id $1
							varchar,--oficina_id $2
							bigint,--terminal_registro_id $3
							bigint,--vehiculo_id $4
							boolean,--es_abonado $5
							bigint,--sesion_id $6
							timestamp with time zone --fecha_hora_ingreso $7
							)RETURNS bigint AS
$$
DECLARE
	_row pca_parqueos.registros%ROWTYPE;
	_liquidacion pca_caja.liquidaciones%ROWTYPE;
BEGIN
	--Verificamos que no exista el vehiculo en el estacionamiento
	SELECT
		*
	INTO
 		_row
	FROM
		pca_parqueos.registros
	WHERE
 		vehiculo_id = $4 AND
		comprobante_id IS NULL;

	IF NOT FOUND THEN	
		INSERT INTO pca_parqueos.registros
			(empresa_id,
			 oficina_id,
			 terminal_registro_id,
			 vehiculo_id,
			 es_abonado,
			 sesion_id,
			 fecha_hora_ingreso)
		VALUES
			($1,$2,$3,$4,$5,$6,$7);

		RETURN pca_global.fn_pseudo_encrypt_bigint(currval('pca_parqueos.seq_registro_id')::integer);
	ELSE
		RAISE EXCEPTION 'El vehiculo ya se encuentra ingresado en la playa de estacionamiento %,Fecha-Hora de ingreso: % %',_row.oficina_id,_row.fecha_hora_ingreso::date,to_char(_row.fecha_hora_ingreso,'HH12:MI PM');
	END IF;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_parqueos.fn_add_registro(varchar,--empresa_id $1
							varchar,--oficina_id $2
							varchar,--usuario_id $3
							integer,--tipo_vehiculo_id $4
							varchar,--placa $5
							bigint,--sesion_id $6
							timestamp with time zone --fecha_hora_ingreso $7
							)RETURNS bigint AS
$$
DECLARE
	_terminal_id pca_parqueos.usuarios_terminales.terminal_id%TYPE;
	_vehiculo_id pca_parqueos.registros.vehiculo_id%TYPE;
	_es_abonado pca_parqueos.registros.es_abonado%TYPE;
	_cliente_id pca_parqueos.vehiculos_abonados.cliente_id%TYPE;
BEGIN
	SELECT
		terminal_id
	INTO
		_terminal_id
	FROM
		pca_parqueos.usuarios_terminales
	WHERE
		empresa_id = $1 AND
		oficina_id = $2 AND
		usuario_id = $3;

	IF NOT FOUND THEN
		RAISE EXCEPTION 'No existe un terminal asignado al usuario';
	END IF;

	SELECT
		vehiculo_id
	INTO
		_vehiculo_id
	FROM
		pca_parqueos.vehiculos
	WHERE
		placa = $5;

	--Si no existe registramos el vehiculo
	IF(NOT FOUND)THEN
		_vehiculo_id := pca_parqueos.fn_add_vehiculo($4,$5);
	END IF;

	--Consultamos si es abonado
	SELECT
		cliente_id
	INTO
		_cliente_id
	FROM
		pca_parqueos.vehiculos_abonados
	WHERE
		empresa_id = $1 AND
		oficina_id = $2	AND
		vehiculo_id = _vehiculo_id;

	IF(FOUND)THEN
		_es_abonado := true;
	ELSE
		_es_abonado := false;
	END IF;

	RETURN pca_parqueos.fn_add_registro($1,$2,_terminal_id,_vehiculo_id,_es_abonado,$6,$7);
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_parqueos.fn_get_registro(varchar,--empresa_id $1
							varchar,--oficina_id $2
							bigint --registro_id $3
							)RETURNS SETOF pca_parqueos.vw_registros AS
$$
DECLARE
	_row pca_parqueos.vw_registros%ROWTYPE;
BEGIN
	FOR _row IN
		SELECT
			*
		FROM
			pca_parqueos.vw_registros
		WHERE
			empresa_id = $1 AND
			oficina_id = $2 AND
			registro_id = $3
	LOOP
		RETURN NEXT _row;
	END LOOP;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_parqueos.fn_get_list_registros(varchar,--empresa_id $1
							      varchar,--oficina_id $2
							      bigint,--liquidacion_id $3
							      varchar --usuario_id $4
							      )RETURNS SETOF pca_parqueos.vw_registros AS
$$
DECLARE
	_row pca_parqueos.vw_registros%ROWTYPE;
BEGIN
	FOR _row IN
		SELECT
			*
		FROM
			pca_parqueos.vw_registros
		WHERE
			empresa_id = $1 AND
			oficina_id = $2 AND
			liquidacion_id = $3 AND
			usuario_id = $4
	LOOP
		RETURN NEXT _row;
	END LOOP;
END;
$$
LANGUAGE plpgsql;

--Devuelve los registros actualmente en la playa de estacionamiento
CREATE OR REPLACE FUNCTION pca_parqueos.fn_get_list_registros_activos(varchar,--empresa_id $1
								      varchar,--oficina_id $2
								      varchar --placa $3
								      )RETURNS SETOF pca_parqueos.vw_registros AS
$$
DECLARE
	_row pca_parqueos.vw_registros%ROWTYPE;
BEGIN
	FOR _row IN
		SELECT
			*
		FROM
			pca_parqueos.vw_registros
		WHERE
			empresa_id = $1 AND
			oficina_id = $2 AND
			lower(pca_global.fn_ascii(placa)) LIKE '%'|| lower(pca_global.fn_ascii($3)) ||'%' AND
			comprobante_id IS NULL
	LOOP
		RETURN NEXT _row;
	END LOOP;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_parqueos.fn_emitir_comprobante(varchar,--empresa_id $1
							      varchar,--oficina_id $2
							      bigint,--registro_id $3
							      bigint,--liquidacion_id $4
							      character,--usuario_id $5
							      bigint,--cliente_id $6
							      bigint,--sesion_id $7
							      integer,--horas_contabilizadas $8
							      varchar,--tipo_comprobante_id $9
							      varchar,--moneda_id $10
							      numeric,--precio_venta $11
							      numeric --efectivo_percibido $12
							      )RETURNS bigint AS
$$
DECLARE
	_registro pca_parqueos.vw_registros%ROWTYPE;
	_terminal_id pca_parqueos.usuarios_terminales.terminal_id%TYPE;
	_correlativo pca.correlativos%ROWTYPE;
	_comprobante_id pca_ventas.comprobantes.comprobante_id%TYPE;

	--Informacion del cliente
	_cliente pca_socios.clientes%ROWTYPE;
	_num_doc_identidad pca_ventas.comprobantes.num_doc_identidad%TYPE;
	_nombre_cliente pca_ventas.comprobantes.nombre_cliente%TYPE;
	_direccion_cliente pca_ventas.comprobantes.direccion_cliente%TYPE;
	
	--Variables para el comprobante de venta
	_serie pca_ventas.comprobantes.serie%TYPE;
	_numero pca_ventas.comprobantes.numero%TYPE;
	_plazo_id pca_ventas.comprobantes.plazo_id%TYPE;
	_precios_incluyen_igv pca_ventas.comprobantes.precios_incluyen_igv%TYPE;
	_porcentaje_igv pca_ventas.comprobantes.porcentaje_igv%TYPE;
	_importe_bruto pca_ventas.comprobantes.importe_bruto%TYPE;
	_descuento pca_ventas.comprobantes.descuento%TYPE;
	_valor_venta pca_ventas.comprobantes.valor_venta%TYPE;
	_impuesto pca_ventas.comprobantes.impuesto%TYPE;
	_precio_venta pca_ventas.comprobantes.precio_venta%TYPE;
	_serie_impresora varchar;

	--Variables para el detalle del documento de venta
	_descripcion pca_ventas.detalles_comprobante.descripcion%TYPE;
	_precio_unitario pca_ventas.detalles_comprobante.precio_unitario%TYPE;

	--Variable para registrar el pago
	_medio_pago_id pca_ventas.pagos_comprobante.medio_pago_id%TYPE;
	_grupo_movimiento_id pca_caja.movimientos.grupo_movimiento_id%TYPE;
	_subgrupo_movimiento_id pca_caja.movimientos.subgrupo_movimiento_id%TYPE;
BEGIN
	--Consultams informacion del terminal
	SELECT
		terminal_id
	INTO
		_terminal_id
	FROM
		pca_parqueos.usuarios_terminales
	WHERE
		empresa_id = $1 AND
		oficina_id = $2 AND
		usuario_id = $5;

	IF NOT FOUND THEN
		RAISE EXCEPTION 'No existe un terminal asignado al usuario';
	END IF;

	--Verificamos que exista correlativo para el tipo de documento
	SELECT
		*
	INTO
		_correlativo
	FROM
		pca.correlativos
	WHERE
		empresa_id = $1 AND
		oficina_id = $2 AND
		terminal_id = _terminal_id AND
		tipo_comprobante_id = $9;

	IF NOT FOUND THEN
		RAISE EXCEPTION 'No existe correlativo para el tipo de documento seleccionado';
	END IF;

	--Inicializamos y calculamos las variables para registrar venta
	_serie := _correlativo.serie;
	_numero := _correlativo.numero + 1;
	_plazo_id := '01';--Al contado por defecto
	_precios_incluyen_igv := true;--Todos los precios incluyen IGV por defecto

	SELECT 
		valor::numeric(4,2) 
	INTO
		_porcentaje_igv 
	FROM 
		pca_tablas.fn_get_configuracion('ValIgv');

	IF NOT FOUND THEN
		RAISE EXCEPTION 'Error al consultar el valor del IGV';
	END IF;

	_importe_bruto := $11;
	_descuento := 0;
	_precio_venta := $11;
	_valor_venta := _precio_venta / (1 + _porcentaje_igv/100);
	_impuesto := _precio_venta - _valor_venta;
	_serie_impresora := _correlativo.serie_impresora;

	
	--Consultamos informacion del cliente
	IF($6 IS NULL OR $6 = 0)THEN
		$6 := NULL;
		_num_doc_identidad := '';
		_nombre_cliente := 'PUBLICO GENERAL';
		_direccion_cliente := '';
	ELSE
		SELECT
			*
		INTO
			_cliente
		FROM
			pca_socios.clientes
		WHERE
			empresa_id = $1 AND
			cliente_id = $6;

		IF NOT FOUND THEN
			RAISE EXCEPTION 'Error al leer datos del cliente';
		END IF;
	
		_num_doc_identidad := _cliente.num_doc_identidad;
		_nombre_cliente := _cliente.nombre_cliente;
		_direccion_cliente := _cliente.direccion_cliente;
	END IF;

	--Consultamos informacion del registro
	SELECT
		*
	INTO
		_registro
	FROM
		pca_parqueos.vw_registros
	WHERE
		empresa_id = $1 AND
		oficina_id = $2 AND
		registro_id = $3;

	IF NOT FOUND THEN
		RAISE EXCEPTION 'Error al consultar informacion del registro';
	END IF;

	_descripcion := 'Parqueo '||_registro.tipo_vehiculo||' Placa: '||_registro.placa;

	_precio_unitario := $11/$8;

	--Valores por defecto para los pagos
	_medio_pago_id := '009';
	_grupo_movimiento_id := 1241588087;

	IF(_registro.tipo_vehiculo_id = 1)THEN --ES AUTO
		_subgrupo_movimiento_id := 1241588087;
	ELSIF(_registro.tipo_vehiculo_id = 2) THEN --ES MOTO
		_subgrupo_movimiento_id := 1755259484;
	ELSE --por defecto auto
		_subgrupo_movimiento_id := 1241588087;
	END IF;

	IF(_registro.es_abonado)THEN
		_descripcion := _descripcion || '(ABONADO)';
		_subgrupo_movimiento_id := 2014125264;
	END IF;

	--Registramos el encabezado del documento de venta
	_comprobante_id := pca_ventas.fn_add_comprobante($1,--empresa_id
							 $2,--oficina_id
							 $9,--tipo_comprobante_id
							 $7,--sesion_id
							 _serie,--serie
							 _numero,--numero
							 $6,--cliente_id
							 _num_doc_identidad,--num_doc_identidad
							 _nombre_cliente,--nombre_cliente
							 _direccion_cliente,--direccion_cliente
							 _plazo_id,--plazo_id
							 current_timestamp,--fecha_hora_emision
							 current_timestamp,--fecha_hora_vencimiento
							 _precios_incluyen_igv,--precios_incluyen_igv
							 _porcentaje_igv,--porcentaje_igv
							 $10,--moneda_id
							 _importe_bruto,--importe_bruto
							 _descuento,--descuento
							 _valor_venta,--valor_venta
							 _impuesto,--impuesto
							 _precio_venta,--precio_venta
							 0,--tipo_cambio_emision
							 '01',--estado_comprobante_id
							 _serie_impresora,--adicional1
							 '',--adicional2
							 '',--adicional3
							 '' --adicional4
							 );

	--Registramos un detalle para el documento de venta
	PERFORM pca_ventas.fn_add_detalle_comprobante($1,--empresa_id
						      $2,--oficina_id
						      _comprobante_id,--comprobante_id
						      $7,--sesion_id
						      0,--correlativo
						      null,--articulo_id
						      null,--codigo
						      $8,--cantidad
						      'Horas',--medida
						      _descripcion,--descripcion
						      _precio_unitario,--precio_unitario
						      0,--precio_costo
						      $11 --precio_total
						      );

	--Registramos un pago para el documento de venta
	PERFORM pca_ventas.fn_add_pago_comprobante($1,--empresa_id
						   $2,--oficina_id
						   _comprobante_id,--comprobante_id
						   _medio_pago_id,--medio_pago_id
						   $12,--efectivo_percibido
						   _grupo_movimiento_id,--grupo_movimiento_id
						   _subgrupo_movimiento_id,--subgrupo_movimiento_id
						   $7,--sesion_id
						   current_date,--fecha
						   $4,--liquidacion_id
						   $5,--usuario_id
						   _descripcion,--detalle
						   $10,--moneda_id
						   $11 --monto
						   );

	--Actualizamos la informacion del registro
	UPDATE pca_parqueos.registros SET
		liquidacion_id = $4,
		usuario_liquidacion_id = $5,
		terminal_liquidacion_id = _terminal_id,
		fecha_hora_salida = current_timestamp,
		horas_contabilizadas = $8,
		comprobante_id = _comprobante_id
	WHERE
		empresa_id = $1 AND
		oficina_id = $2 AND
		registro_id = $3;

	--Actualizamos el numero del correlativo
	UPDATE pca.correlativos SET
		numero = numero + 1
	WHERE
		empresa_id = $1 AND
		oficina_id = $2 AND
		terminal_id = _terminal_id AND
		tipo_comprobante_id = $9;
		
	RETURN _comprobante_id;
END;
$$
LANGUAGE plpgsql;

----------------------------------------------------------------------------------------------------------
------------------------------------pca_parqueos.vehiculos_abonados---------------------------------------
----------------------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION pca_parqueos.fn_get_cliente(varchar,--empresa_id $1
						       varchar,--oficina_id $2
						       bigint --vehiculo_id $3
						       )RETURNS SETOF pca_socios.vw_clientes AS
$$
DECLARE
	_row pca_socios.vw_clientes%ROWTYPE;
BEGIN
	FOR _row IN
		SELECT
			*
		FROM
			pca_socios.vw_clientes
		WHERE
			empresa_id = $1 AND
			cliente_id = (SELECT 
						cliente_id 
				      FROM
						pca_parqueos.vehiculos_abonados
				      WHERE
						empresa_id = $1 AND
						oficina_id = $2 AND
						vehiculo_id = $3)
	LOOP
		RETURN NEXT _row;
	END LOOP;
END;
$$
LANGUAGE plpgsql;

----------------------------------------------------------------------------------------------------------
--------------------------------pca_parqueos.tarifas_abonados---------------------------------------------
----------------------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION pca_parqueos.fn_get_tarifa_abonado(varchar,--empresa_id $1
							      varchar,--oficina_id $2
							      bigint --abonado_id $3
							      )RETURNS SETOF pca_parqueos.vw_tarifas_abonados AS
$$
DECLARE
	_row pca_parqueos.vw_tarifas_abonados%ROWTYPE;
BEGIN
	FOR _row IN
		SELECT
			*
		FROM
			pca_parqueos.vw_tarifas_abonados
		WHERE
			empresa_id = $1 AND
			oficina_id = $2 AND
			abonado_id = $3
	LOOP
		RETURN NEXT _row;
	END LOOP;
END;
$$
LANGUAGE plpgsql

CREATE OR REPLACE FUNCTION pca_parqueos.fn_update_tarifa_abonado(varchar,--empresa_id $1
								 varchar,--oficina_id $2
								 bigint,--abonado_id $3
								 integer,--desencadenador_id $4
								 varchar,--moneda_id $5
								 numeric --monto $6
								 )RETURNS void AS
$$
DECLARE
	_row pca_parqueos.tarifas_abonados%ROWTYPE;
BEGIN
	SELECT
		*
	INTO
		_row
	FROM
		pca_parqueos.tarifas_abonados
	WHERE
		empresa_id = $1 AND
		oficina_id = $2 AND
		abonado_id = $3;
	IF FOUND THEN
		UPDATE pca_parqueos.tarifas_abonados SET
			desencadenador_id = $4,
			moneda_id = $5,
			monto = $6
		WHERE
			empresa_id = $1 AND
			oficina_id = $2 AND
			abonado_id = $3;
	ELSE
		INSERT INTO pca_parqueos.tarifas_abonados VALUES($1,$2,$3,$4,$5,$6);
	END IF;
END;
$$
LANGUAGE plpgsql;

----------------------------------------------------------------------------------------------------------
-------------------------------pca_parqueos.tarifas_generales---------------------------------------------
----------------------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION pca_parqueos.fn_get_tarifa_general(varchar,--empresa_id $1
							      varchar,--oficina_id $2
							      integer --tipo_vehiculo_id $3
							      )RETURNS SETOF pca_parqueos.vw_tarifas_generales AS
$$
DECLARE
	_row pca_parqueos.vw_tarifas_generales%ROWTYPE;
BEGIN
	FOR _row IN
		SELECT
			*
		FROM
			pca_parqueos.vw_tarifas_generales
		WHERE
			empresa_id = $1 AND
			oficina_id = $2 AND
			tipo_vehiculo_id = $3
	LOOP
		RETURN NEXT _row;
	END LOOP;
END;
$$
LANGUAGE plpgsql;

----------------------------------------------------------------------------------------------------------
-------------------------------------Registrar movimientos de caja ---------------------------------------
----------------------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION pca_parqueos.fn_add_movimiento(varchar,--empresa_id $1
							  varchar,--oficina_id $2
							  bigint,--sesion_id $3
							  varchar,--tipo_movimiento_id $4
							  bigint,--liquidacion_id $5
							  character,--usuario_id $6
							  varchar,--detalle $7
							  varchar,--moneda_id $8
							  numeric --monto $9
						          )RETURNS bigint AS
$$
DECLARE
	_grupo_movimiento_id pca_caja.movimientos.grupo_movimiento_id%TYPE;	
BEGIN
	--Pendiente de automatizacion
	IF($4 ='I')THEN
		_grupo_movimiento_id := 1755259484;
	ELSE
		_grupo_movimiento_id := 2014125264;
	END IF;

	RETURN pca_caja.fn_add_movimiento($1,--empresa_id
				          $2,--oficina_id
				          _grupo_movimiento_id,--grupo_movimiento_id
				          NULL,--subgrupo_movimiento_id
				          $3,--sesion_id
				          current_date,--fecha
				          $5,--liquidacion_id
				          $6,--usuario_id
				          $7,--detalle
				          $8,--moneda_id
				          $9 --monto
				          );
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_parqueos.fn_update_movimiento(varchar,--empresa_id $1
							     varchar,--oficina_id $2
							     bigint,--movimiento_id $3
							     bigint,--sesion_id $4
							     varchar,--tipo_movimiento_id $5
							     varchar,--detalle $6
							     varchar,--moneda_id $7
							     numeric --monto $8
							     )RETURNS void AS
$$
DECLARE
	_row pca_caja.movimientos%ROWTYPE;
	_grupo_movimiento_id pca_caja.movimientos.grupo_movimiento_id%TYPE;
	_detalle pca_caja.movimientos.detalle%TYPE;
BEGIN
	SELECT
		*
	INTO
		_row
	FROM
		pca_caja.movimientos
	WHERE
		empresa_id = $1 AND
		oficina_id = $2 AND
		movimiento_id = $3;

	IF FOUND THEN
		--Por automatizar :/
		IF(_row.grupo_movimiento_id = 1241588087)THEN
			RAISE EXCEPTION 'No se permiten modificar cobros parqueo';
		END IF;

		--Pendiente de automatizacion
		IF($5 ='I')THEN
			_grupo_movimiento_id := 1755259484;
		ELSE
			_grupo_movimiento_id := 2014125264;
		END IF;

		--No modificar el detalle para saldo inicial
		IF(_row.grupo_movimiento_id = 1500453386)THEN
			_detalle := _row.detalle;
			_grupo_movimiento_id := _row.grupo_movimiento_id;
		ELSE
			_detalle := $6;
		END IF;
		
		PERFORM pca_caja.fn_update_movimiento($1,--empresa_id
						      $2,--oficina_id
						      $3,--movimiento_id
						      _grupo_movimiento_id,--grupo_movimiento_id
						      _row.subgrupo_movimiento_id,--subgrupo_movimiento_id
						      $4,--sesion_id
						      _detalle,--detalle
						      $7,--moneda_id
						      $8 --monto
						      );
	ELSE
		RAISE EXCEPTION 'Error al consultar informacion del movimiento';
	END IF;
END;
$$
LANGUAGE plpgsql;

----------------------------------------------------------------------------------------------------------
------------------------------------pca_parqueos.vehiculos_abonados---------------------------------------
----------------------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION pca_parqueos.fn_add_vehiculo_abonado(varchar,--empresa_id $1
								varchar,--oficina_id $2
								bigint,--vehiculo_id $3
								bigint,--cliente_id $4
								bigint --sesion_id $5
								)RETURNS void AS
$$
BEGIN
	INSERT INTO pca_parqueos.vehiculos_abonados 
		(empresa_id,
		oficina_id,
		vehiculo_id,
		cliente_id,
		sesion_id)
	VALUES
		($1,$2,$3,$4,$5);
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_parqueos.fn_add_vehiculo_abonado(varchar,--empresa_id $1
								varchar,--oficina_id $2
								integer,--tipo_vehiculo_id $3
								varchar,--placa $4
								bigint,--cliente_id $5
								bigint --sesion_id $6
								)RETURNS void AS
$$
DECLARE
	_vehiculo_id pca_parqueos.registros.vehiculo_id%TYPE;
	_cliente_id pca_parqueos.vehiculos_abonados.cliente_id%TYPE;
BEGIN
	SELECT
		vehiculo_id
	INTO
		_vehiculo_id
	FROM
		pca_parqueos.vehiculos
	WHERE
		placa = $4;

	--Si no existe registramos el vehiculo
	IF(NOT FOUND)THEN
		_vehiculo_id := pca_parqueos.fn_add_vehiculo($3,$4);
		PERFORM pca_parqueos.fn_add_vehiculo_abonado($1,$2,_vehiculo_id,$5,$6);
	ELSE
		SELECT
			cliente_id
		INTO
			_cliente_id
		FROM
			pca_parqueos.vehiculos_abonados
		WHERE
			empresa_id = $1 AND
			oficina_id = $2	AND
			vehiculo_id = _vehiculo_id;

		--Si no esta registrado como abonado lo registramos
		IF(NOT FOUND)THEN
			PERFORM pca_parqueos.fn_add_vehiculo_abonado($1,$2,_vehiculo_id,$5,$6);
		ELSE
			RAISE EXCEPTION 'El vehiculo de placa % ya esta asignado a un abonado',$4;
		END IF;
	END IF;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_parqueos.fn_del_vehiculo_abonado(varchar,--empresa_id $1
								varchar,--oficina_id $2
								bigint --vehiculo_id $3
								)RETURNS void AS
$$
BEGIN
	DELETE FROM
		pca_parqueos.vehiculos_abonados
	WHERE
		empresa_id = $1 AND
		oficina_id = $2 AND
		vehiculo_id = $3;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_parqueos.fn_get_vehiculo_abonado(varchar,--empresa_id $1
								varchar,--oficina_id $2
								bigint --vehiculo_id $3
								)RETURNS SETOF pca_parqueos.vw_vehiculos_abonados AS
$$
DECLARE
	_row pca_parqueos.vw_vehiculos_abonados%ROWTYPE;
BEGIN
	FOR _row IN
		SELECT
			*
		FROM
			pca_parqueos.vw_vehiculos_abonados
		WHERE
			empresa_id = $1 AND
		        oficina_id = $2 AND
		        vehiculo_id = $3
	LOOP
		RETURN NEXT _row;
	END LOOP;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_parqueos.fn_get_list_vehiculos_abonados(integer,--start $1
								       integer,--limit $2
								       varchar,--empresa_id $3
								       varchar,--oficina_id $4
								       varchar --filtro(placa-nombre cliente) $5
								       )RETURNS SETOF refcursor AS
$$
DECLARE
	cursor_result refcursor;
	cursor_totalrows refcursor;
BEGIN
	OPEN cursor_result FOR
		SELECT
			*
		FROM
			pca_parqueos.vw_vehiculos_abonados
		WHERE
			empresa_id = $3 AND
			oficina_id = $4 AND
			lower(pca_global.fn_ascii(concat(placa,cliente))) LIKE '%'|| lower(pca_global.fn_ascii($5)) ||'%'
		ORDER BY
			cliente ASC LIMIT $2 OFFSET $1;
	RETURN NEXT cursor_result;

	OPEN cursor_totalrows FOR
		SELECT
			*
		FROM
			pca_parqueos.vw_vehiculos_abonados
		WHERE
			empresa_id = $3 AND
			oficina_id = $4 AND
			lower(pca_global.fn_ascii(concat(placa,cliente))) LIKE '%'|| lower(pca_global.fn_ascii($5)) ||'%';
	RETURN NEXT cursor_totalrows;
END;
$$
LANGUAGE plpgsql;